Serverless Framework+Java+GradleでS3に配置したパッケージからAWS Lambda関数をデプロイしてみた
はじめに
タイトルにあげた構成で、最小の手間で動くものをデプロイしてみました。
Java+Gradleな環境はServerless Frameworkの--templateオプションでテンプレートを生成して作成できます。
S3に配置したパッケージをデプロイするには、serverless.ymlのpackage > artifactにパッケージファイルのS3URLを指定するだけです。 公式のガイドはこちらです→Serverless Framework Guide - AWS Lambda Guide - Packaging
環境
$ sw_vers ProductName: Mac OS X :
$ serverless -v Framework Core: 1.64.1 (standalone) Plugin: 3.4.1 SDK: 2.3.0
やってみたこと
- テンプレートの生成
- ビルド実行
- パッケージファイルをS3上に配置
- serverless.ymlの設定
- デプロイ
テンプレートの生成
次のコマンドで、コードのスケルトンを生成します1
$ serverless create --template aws-java-gradle
次の構成でファイルが生成されます
├── build.gradle ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── serverless.yml └── src └── main ├── java │ └── com │ └── serverless │ ├── ApiGatewayResponse.java │ ├── Handler.java │ └── Response.java └── resources └── log4j.properties
ビルド実行
デフォルトの設定のまま、ビルドを実行します。2
$ ./gradlew build
./build/distributionsディレクトリにパッケージファイル(hello.zip)が生成されることを確認します。
パッケージファイルをS3に配置
バケットを用意してパッケージファイルをアップロードします。 CLIで「try-sls-deploy-from-artifact」というバケットにアップロードする場合には次のコマンドになります
$ aws s3 cp ./build/distributions/hello.zip s3://try-sls-deploy-from-artifact/hello.zip
serverless.ymlの設定
パッケージファイルを配置したS3バケットと同じリージョンにデプロイするように設定を変更する必要があります。 また、package > artifactに、アップロードしたパッケージファイルのパスをパス形式で3指定します。
例えば、東京リージョン(ap-northeast-1)に配置された「try-sls-deploy-from-artifact」というバケットにパッケージファイルをアップロードした場合には次のような設定になります。
service: service-200329 provider: name: aws runtime: java8 region: ap-northeast-1 package: artifact: https://s3.amazonaws.com/try-sls-deploy-from-artifact/hello.zip functions: hello: handler: com.serverless.Handler
デプロイ
あとはデプロイするだけです。
$ serverless deploy
さいごに
Serverless Frameworkを使ったビルド方法の紹介でした。 ちなみに個人的には脚注にも少し記載しましたが、artifactのURLを パス形式で 記載する必要があるという点でハマりました。 誰かの参考になれば幸いです。
参考
- テンプレートを利用しない場合には、次の記事を参考にファイルを構成してください。Java 関数の ZIP デプロイパッケージの作成 - AWS Lambda ↩
- windows環境の方はバッチファイル(./gradlew.bat)を利用します ↩
- 仮想ホスト形式ではなく、パス形式(https://s3.amazonaws.com/bucket-name/keyname) で指定します。参考→https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro ↩